package org.javahispano.javacup.tacticas_aceptadas.elyorch;

import java.awt.Color;
import org.javahispano.javacup.modelo.*;
import java.util.LinkedList;
import java.util.List;

public class TacticaElYorch implements Tactica {

    Posicion alineacion1[] = new Posicion[]{
        new Posicion(0.2595419847328244, -50.41044776119403),
        new Posicion(-19.97202797202797, -35.63348416289593),
        new Posicion(-7.37062937062937, -35.63348416289593),
        new Posicion(6.895104895104895, -35.63348416289593),
        new Posicion(19.97202797202797, -35.63348416289593),
        new Posicion(-0.7132867132867133, -27.08144796380091),
        new Posicion(-17.389312977099234, -19.58955223880597),
        new Posicion(15.454545454545453, -19.2420814479638),
        new Posicion(-0.4755244755244755, -10.927601809954751),
        new Posicion(-1.188811188811189, 0.0),
        new Posicion(3.3286713286713288, -4.513574660633484)
    };
    Posicion alineacion2[] = new Posicion[]{
        new Posicion(0.2595419847328244, -50.41044776119403),
        new Posicion(-19.97202797202797, -35.63348416289593),
        new Posicion(-7.37062937062937, -35.63348416289593),
        new Posicion(6.895104895104895, -35.63348416289593),
        new Posicion(19.97202797202797, -35.63348416289593),
        new Posicion(-0.7132867132867133, -27.08144796380091),
        new Posicion(-17.389312977099234, -19.58955223880597),
        new Posicion(15.454545454545453, -19.2420814479638),
        new Posicion(-0.4755244755244755, -9.264705882352942),
        new Posicion(-9.986013986013985, -0.47511312217194573),
        new Posicion(9.986013986013985, -0.47511312217194573)
    };
//Cuadrate A
    Posicion alineacionA[] = new Posicion[]{
        new Posicion(0.0, -52.0),
        new Posicion(-20.0, -36.0),
        new Posicion(-13.0, -36.0),
        new Posicion(-6.0, -36.0),
        new Posicion(2.0, -36.0),
        new Posicion(-16.0, -33.0),
        new Posicion(-22.0, -30.0),
        new Posicion(-10.0, 30.0),
        new Posicion(-16.0, -27.0),
        new Posicion(-24.0, -11.0),
        new Posicion(-8.0, 11.0)
    };

//Cuadrate B
    Posicion alineacionB[] = new Posicion[]{
        new Posicion(0.0, -52.0),
        new Posicion(-8.0, -36.0),
        new Posicion(-3.0, -36.0),
        new Posicion(3.0, -36.0),
        new Posicion(8.0, -36.0),
        new Posicion(0.0, -33.0),
        new Posicion(-6.0, -30.0),
        new Posicion(6.0, 30.0),
        new Posicion(0.0, -27.0),
        new Posicion(-8.0, -11.0),
        new Posicion(8.0, 11.0)
    };

//Cuadrate C
    Posicion alineacionC[] = new Posicion[]{
        new Posicion(0.0, -52.0),
        new Posicion(-2.0, -36.0),
        new Posicion(6.0, -36.0),
        new Posicion(13.0, -36.0),
        new Posicion(20.0, -36.0),
        new Posicion(16.0, -33.0),
        new Posicion(10.0, -30.0),
        new Posicion(22.0, 30.0),
        new Posicion(16.0, -27.0),
        new Posicion(8.0, -11.0),
        new Posicion(24.0, 11.0)
    };

//Cuadrate D
    Posicion alineacionD[] = new Posicion[]{
        new Posicion(0.0, -52.0),
        new Posicion(-22.0, -32.0),
        new Posicion(-15.0, -32.0),
        new Posicion(-7.0, -32.0),
        new Posicion(0.0, -32.0),
        new Posicion(-11.0, -22.0),
        new Posicion(-20.0, -13.0),
        new Posicion(-2.0, -13.0),
        new Posicion(-11.0, -4.0),
        new Posicion(-16.0, 20.0),
        new Posicion(-6.0, 7.0)
    };

//Cuadrate E
    Posicion alineacionE[] = new Posicion[]{
        new Posicion(0.0, -52.0),
        new Posicion(-11.0, -32.0),
        new Posicion(-4.0, -32.0),
        new Posicion(4.0, -32.0),
        new Posicion(11.0, -32.0),
        new Posicion(0.0, -22.0),
        new Posicion(-9.0, -13.0),
        new Posicion(9.0, -13.0),
        new Posicion(0.0, -4.0),
        new Posicion(-5.0, 20.0),
        new Posicion(5.0, 7.0)
    };

//Cuadrate F
    Posicion alineacionF[] = new Posicion[]{
        new Posicion(0.0, -52.0),
        new Posicion(0.0, -32.0),
        new Posicion(7.0, -32.0),
        new Posicion(15.0, -32.0),
        new Posicion(22.0, -32.0),
        new Posicion(11.0, -22.0),
        new Posicion(2.0, -13.0),
        new Posicion(20.0, -13.0),
        new Posicion(11.0, -4.0),
        new Posicion(6.0, 20.0),
        new Posicion(16.0, 7.0)
    };

//Cuadrate G
    Posicion alineacionG[] = new Posicion[]{
        new Posicion(0.0, -52.0),
        new Posicion(-17.0, -28.0),
        new Posicion(-5.0, -28.0),
        new Posicion(5.0, -28.0),
        new Posicion(17.0, -28.0),
        new Posicion(-11.0, 4.0),
        new Posicion(-20.0, 13.0),
        new Posicion(-2.0, 13.0),
        new Posicion(-11.0, 22.0),
        new Posicion(-21.0, 36.0),
        new Posicion(0.0, 36.0)
    };

//Cuadrate H
    Posicion alineacionH[] = new Posicion[]{
        new Posicion(0.0, -52.0),
        new Posicion(-17.0, -28.0),
        new Posicion(-5.0, -28.0),
        new Posicion(5.0, -28.0),
        new Posicion(17.0, -28.0),
        new Posicion(0.0, 4.0),
        new Posicion(-9.0, 13.0),
        new Posicion(9.0, 13.0),
        new Posicion(0.0, 22.0),
        new Posicion(-11.0, 36.0),
        new Posicion(11.0, 36.0)
    };

//Cuadrate I
    Posicion alineacionI[] = new Posicion[]{
        new Posicion(0.0, -52.0),
        new Posicion(-17.0, -28.0),
        new Posicion(-5.0, -28.0),
        new Posicion(5.0, -28.0),
        new Posicion(17.0, -28.0),
        new Posicion(11.0, 4.0),
        new Posicion(2.0, 13.0),
        new Posicion(20.0, 13.0),
        new Posicion(11.0, -22.0),
        new Posicion(0.0, 36.0),
        new Posicion(21.0, 36.0)
    };

//Cuadrate J
    Posicion alineacionJ[] = new Posicion[]{
        new Posicion(0.0, -52.0),
        new Posicion(-20.0, -23.0),
        new Posicion(-8.0, -23.0),
        new Posicion(8.0, -23.0),
        new Posicion(20.0, -23.0),
        new Posicion(-15.0, 26.0),
        new Posicion(-22.0, 33.0),
        new Posicion(-8.0, 33.0),
        new Posicion(-15.0, 41.0),
        new Posicion(-22.0, 41.0),
        new Posicion(0.0, 41.0)
    };

//Cuadrate K
    Posicion alineacionK[] = new Posicion[]{
        new Posicion(0.0, -52.0),
        new Posicion(-20.0, -23.0),
        new Posicion(-8.0, -23.0),
        new Posicion(8.0, -23.0),
        new Posicion(20.0, -23.0),
        new Posicion(0.0, 26.0),
        new Posicion(-8.0, 33.0),
        new Posicion(8.0, 33.0),
        new Posicion(0.0, 41.0),
        new Posicion(-7.0, 41.0),
        new Posicion(7.0, 41.0)
    };

//Cuadrate L
    Posicion alineacionL[] = new Posicion[]{
        new Posicion(0.0, -52.0),
        new Posicion(-20.0, -23.0),
        new Posicion(-8.0, -23.0),
        new Posicion(8.0, -23.0),
        new Posicion(20.0, -23.0),
        new Posicion(15.0, 26.0),
        new Posicion(8.0, 33.0),
        new Posicion(22.0, 33.0),
        new Posicion(15.0, 41.0),
        new Posicion(0.0, 41.0),
        new Posicion(22.0, 41.0)
    };

    class TacticaDetalleImpl implements TacticaDetalle {

        public String getNombre() {
            return "ElYorch";
        }

        public String getPais() {
            return "España";
        }

        public String getEntrenador() {
            return "Jorge Melchor Gomez";
        }

        public Color getColorCamiseta() {
            return new Color(255, 255, 255);
        }

        public Color getColorPantalon() {
            return new Color(0, 0, 0);
        }

        public Color getColorFranja() {
            return new Color(102, 0, 102);
        }

        public Color getColorCalcetas() {
            return new Color(102, 0, 102);
        }

        public Color getColorPortero() {
            return new Color(237, 15, 216);
        }

        public EstiloUniforme getEstilo() {
            return EstiloUniforme.FRANJA_HORIZONTAL;
        }

        public Color getColorCamiseta2() {
            return new Color(102, 0, 102);
        }

        public Color getColorPantalon2() {
            return new Color(255, 255, 255);
        }

        public Color getColorFranja2() {
            return new Color(0, 0, 0);
        }

        public Color getColorCalcetas2() {
            return new Color(102, 0, 102);
        }

        public Color getColorPortero2() {
            return new Color(255, 0, 255);
        }

        public EstiloUniforme getEstilo2() {
            return EstiloUniforme.FRANJA_HORIZONTAL;
        }

        class JugadorImpl implements JugadorDetalle {

            String nombre;
            int numero;
            Color piel, pelo;
            double velocidad, remate, presicion;
            boolean portero;
            Posicion posicion;

            public JugadorImpl(String nombre, int numero, Color piel, Color pelo,
                    double velocidad, double remate, double presicion, boolean portero) {
                this.nombre = nombre;
                this.numero = numero;
                this.piel = piel;
                this.pelo = pelo;
                this.velocidad = velocidad;
                this.remate = remate;
                this.presicion = presicion;
                this.portero = portero;
            }

            public String getNombre() {
                return nombre;
            }

            public Color getColorPiel() {
                return piel;
            }

            public Color getColorPelo() {
                return pelo;
            }

            public int getNumero() {
                return numero;
            }

            public boolean esPortero() {
                return portero;
            }

            public double getVelocidad() {
                return velocidad;
            }

            public double getRemate() {
                return remate;
            }

            public double getPresicion() {
                return presicion;
            }
        }

        public JugadorDetalle[] getJugadores() {
            return new JugadorDetalle[]{
                        new JugadorImpl("Jugador1", 1, new Color(255, 200, 150), new Color(50, 0, 0), 1.0d, 1.0d, 0.7d, true),
                        new JugadorImpl("Jugador2", 2, new Color(255, 200, 150), new Color(50, 0, 0), 1.0d, 1.0d, 0.45d, false),
                        new JugadorImpl("Jugador3", 3, new Color(255, 200, 150), new Color(50, 0, 0), 1.0d, 1.0d, 0.45d, false),
                        new JugadorImpl("Jugador4", 4, new Color(255, 200, 150), new Color(50, 0, 0), 1.0d, 1.0d, 0.45d, false),
                        new JugadorImpl("Jugador5", 5, new Color(255, 200, 150), new Color(50, 0, 0), 1.0d, 1.0d, 0.45d, false),
                        new JugadorImpl("Jugador6", 6, new Color(255, 200, 150), new Color(50, 0, 0), 1.0d, 0.8d, 0.6d, false),
                        new JugadorImpl("Jugador7", 7, new Color(255, 200, 150), new Color(50, 0, 0), 1.0d, 0.8d, 0.6d, false),
                        new JugadorImpl("Jugador8", 8, new Color(255, 200, 150), new Color(50, 0, 0), 1.0d, 0.8d, 0.6d, false),
                        new JugadorImpl("Jugador9", 9, new Color(255, 200, 150), new Color(50, 0, 0), 1.0d, 0.8d, 0.6d, false),
                        new JugadorImpl("Jugador10", 10, new Color(255, 200, 150), new Color(50, 0, 0), 1.0d, 0.7d, 1.0d, false),
                        new JugadorImpl("Jugador11", 11, new Color(255, 200, 150), new Color(50, 0, 0), 1.0d, 0.7d, 1.0d, false),};
        }
    }
    TacticaDetalle detalle = new TacticaDetalleImpl();

    public TacticaDetalle getDetalle() {
        return detalle;
    }

    public Posicion[] getPosicionSaca(SituacionPartido sp) {
        return alineacion1;
    }

    public Posicion[] getPosicionRecive(SituacionPartido sp) {
        return alineacion2;
    }
    LinkedList<Comando> comandos = new LinkedList<Comando>();

    public List<Comando> ejecutar(SituacionPartido sp) {
        comandos.clear();

        char cuadrante = getCuadrante(sp);
        int rematan[] = sp.puedenRematar();
        Posicion miEquipo[] = sp.misJugadores();
        Posicion equipoRival[] = sp.rivales();
        int rematanRivales[] = sp.puedenRematarRival();
        int indMasCercano = 9;
        int indMasCercanoAux = getIndMasCercano(sp);
        if (indMasCercanoAux != -1) {
            indMasCercano = indMasCercanoAux;
        }
        int indMasCercanoTrasBalon = 9;
        int indMasCercanoTrasBalonAux = getIndMasCercanoTrasBalon(sp);
        if (indMasCercanoTrasBalonAux != -1) {
            indMasCercanoTrasBalon = indMasCercanoTrasBalonAux;
        }
        int indMasCercanoDelanteBalon = -1;
        indMasCercanoDelanteBalon = getIndMasCercanoDelanteBalon(sp);

        //Si no tengo la posesi�n.
        if (rematan.length == 0) {
            //Van a por �l, los m�s cercanos
            if (indMasCercano != -1) {
                comandos.add(new ComandoIrA(indMasCercano, sp.balon()));
            }
            if (indMasCercanoTrasBalon != -1) {
                comandos.add(new ComandoIrA(indMasCercanoTrasBalon, sp.balon()));
            }
            if (indMasCercanoDelanteBalon != -1) {
                comandos.add(new ComandoIrA(indMasCercanoDelanteBalon, sp.balon()));
            }
            if (indMasCercanoTrasBalon != 0 && indMasCercano != 0) {
                colocarPortero(sp.balon());
            }
        }

        //Si tengo la posesi�n.
        if ((rematanRivales.length == 0) && (rematan.length > 0)) {
            switch (cuadrante) {
                case 'A':
                    despejar(rematan[0], sp.balon());
                    break;
                case 'B':
                    despejar(rematan[0], sp.balon());
                    break;
                case 'C':
                    despejar(rematan[0], sp.balon());
                    break;
                case 'D':
                    if (getHayRivalDelante(miEquipo[rematan[0]], equipoRival)) {
                        disparoLejano(rematan[0]);
                    } else {
                        avanzarConBalon(rematan[0]);
                    }
                    break;
                case 'E':
                    if (getHayRivalDelante(miEquipo[rematan[0]], equipoRival)) {
                        disparoLejano(rematan[0]);
                    } else {
                        avanzarConBalon(rematan[0]);
                    }
                    break;
                case 'F':
                    if (getHayRivalDelante(miEquipo[rematan[0]], equipoRival)) {
                        disparoLejano(rematan[0]);
                    } else {
                        avanzarConBalon(rematan[0]);
                    }
                    break;
                case 'G':
                    if (getHayRivalDelante(miEquipo[rematan[0]], equipoRival)) {
                        disparoLejano(rematan[0]);
                    } else {
                        avanzarConBalon(rematan[0]);
                    }
                    break;
                case 'H':
                    if (getHayRivalDelante(miEquipo[rematan[0]], equipoRival)) {
                        disparoLejano(rematan[0]);
                    } else {
                        avanzarConBalon(rematan[0]);
                    }
                    break;
                case 'I':
                    if (getHayRivalDelante(miEquipo[rematan[0]], equipoRival)) {
                        disparoLejano(rematan[0]);
                    } else {
                        avanzarConBalon(rematan[0]);
                    }
                    break;
                case 'J':
                    if (getHayRivalDelante(miEquipo[rematan[0]], equipoRival)) {
                        if (sp.balon().distancia(Constantes.centroArcoSup) < 25) {
                            rematarAPuerta(rematan[0], miEquipo[0]);
                        } else {
                            pasarBalon(indMasCercano, miEquipo[10]);
                        }
                    } else {
                        avanzarConBalon(rematan[0]);
                    }
                    break;
                case 'K':
                    if (getHayRivalDelante(miEquipo[rematan[0]], equipoRival)) {
                        if (sp.balon().distancia(Constantes.centroArcoSup) < 25) {
                            rematarAPuerta(rematan[0], miEquipo[0]);
                        } else {
                            disparoLejano(rematan[0]);
                        }
                    } else {
                        avanzarConBalon(rematan[0]);
                    }
                    break;
                case 'L':
                    if (getHayRivalDelante(miEquipo[rematan[0]], equipoRival)) {
                        if (sp.balon().distancia(Constantes.centroArcoSup) < 25) {
                            rematarAPuerta(rematan[0], miEquipo[0]);
                        } else {
                            pasarBalon(indMasCercano, miEquipo[9]);
                        }
                    } else {
                        avanzarConBalon(rematan[0]);
                    }
                    break;
            }
        }
        colocarEauipo(cuadrante, indMasCercano, indMasCercanoTrasBalon);
        return comandos;
    }

    private char getCuadrante(SituacionPartido sp) {
        char cuadrante = 'E';
        if (sp.balon().getY() < -26.25) {
            if (sp.balon().getX() < -11.4) {
                cuadrante = 'A';
            } else if (sp.balon().getX() < 11.4) {
                cuadrante = 'B';
            } else {
                cuadrante = 'C';
            }

        } else if (sp.balon().getY() < 0.0) {
            if (sp.balon().getX() < -11.4) {
                cuadrante = 'D';
            } else if (sp.balon().getX() < 11.4) {
                cuadrante = 'E';
            } else {
                cuadrante = 'F';
            }

        } else if (sp.balon().getY() < 26.25) {
            if (sp.balon().getX() < -11.4) {
                cuadrante = 'G';
            } else if (sp.balon().getX() < 11.4) {
                cuadrante = 'H';
            } else {
                cuadrante = 'I';
            }

        } else {
            if (sp.balon().getX() < -11.4) {
                cuadrante = 'J';
            } else if (sp.balon().getX() < 11.4) {
                cuadrante = 'K';
            } else {
                cuadrante = 'L';
            }
        }
        return cuadrante;
    }

    private void colocarEauipo(char cuadrante, int indMasCercano, int indMasCercanoTrasBalon) {
        switch (cuadrante) {
            case 'A':
                for (int i = 1; i < 11; i++) {
                    if (i != indMasCercano && i != indMasCercanoTrasBalon) {
                        comandos.add(new ComandoIrA(i, alineacionA[i]));
                    }
                }
                break;
            case 'B':
                for (int i = 1; i < 11; i++) {
                    if (i != indMasCercano && i != indMasCercanoTrasBalon) {
                        comandos.add(new ComandoIrA(i, alineacionB[i]));
                    }
                }
                break;
            case 'C':
                for (int i = 1; i < 11; i++) {
                    if (i != indMasCercano && i != indMasCercanoTrasBalon) {
                        comandos.add(new ComandoIrA(i, alineacionC[i]));
                    }
                }
                break;
            case 'D':
                for (int i = 1; i < 11; i++) {
                    if (i != indMasCercano && i != indMasCercanoTrasBalon) {
                        comandos.add(new ComandoIrA(i, alineacionD[i]));
                    }
                }
                break;
            case 'E':
                for (int i = 1; i < 11; i++) {
                    if (i != indMasCercano && i != indMasCercanoTrasBalon) {
                        comandos.add(new ComandoIrA(i, alineacionE[i]));
                    }
                }
                break;
            case 'F':
                for (int i = 1; i < 11; i++) {
                    if (i != indMasCercano && i != indMasCercanoTrasBalon) {
                        comandos.add(new ComandoIrA(i, alineacionF[i]));
                    }
                }
                break;
            case 'G':
                for (int i = 1; i < 11; i++) {
                    if (i != indMasCercano && i != indMasCercanoTrasBalon) {
                        comandos.add(new ComandoIrA(i, alineacionG[i]));
                    }
                }
                break;
            case 'H':
                for (int i = 1; i < 11; i++) {
                    if (i != indMasCercano && i != indMasCercanoTrasBalon) {
                        comandos.add(new ComandoIrA(i, alineacionH[i]));
                    }
                }
                break;
            case 'I':
                for (int i = 1; i < 11; i++) {
                    if (i != indMasCercano && i != indMasCercanoTrasBalon) {
                        comandos.add(new ComandoIrA(i, alineacionI[i]));
                    }
                }
                break;
            case 'J':
                for (int i = 1; i < 11; i++) {
                    if (i != indMasCercano && i != indMasCercanoTrasBalon) {
                        comandos.add(new ComandoIrA(i, alineacionJ[i]));
                    }
                }
                break;
            case 'K':
                for (int i = 1; i < 11; i++) {
                    if (i != indMasCercano && i != indMasCercanoTrasBalon) {
                        comandos.add(new ComandoIrA(i, alineacionK[i]));
                    }
                }
                break;
            case 'L':
                for (int i = 1; i < 11; i++) {
                    if (i != indMasCercano && i != indMasCercanoTrasBalon) {
                        comandos.add(new ComandoIrA(i, alineacionL[i]));
                    }
                }
                break;
            default:
                for (int i = 1; i < 11; i++) {
                    if (i != indMasCercano && i != indMasCercanoTrasBalon) {
                        comandos.add(new ComandoIrA(i, alineacionE[i]));
                    }
                }
        }
    }

    private int getIndMasCercano(SituacionPartido sp) {
        int indAux = sp.balon().indiceMasCercano(sp.misJugadores());
        if ((indAux != 0) || (indAux == 0 && sp.balon().getY() < -44.0)) {
            return indAux;
        } else {
            return -1;
        }
    }

    private int getIndMasCercanoTrasBalon(SituacionPartido sp) {
        int indMasCercanoTrasBalon = -1;
        Posicion miEquipo[] = sp.misJugadores();
        int[] masAtrasBalon = new int[11];
        for (int i = 0; i < 11; i++) {
            masAtrasBalon[i] = -1;
        }
        int cont = 0;
        for (int i = 0; i < 11; i++) {
            if (miEquipo[i].getY() < sp.balon().getY()) {
                masAtrasBalon[cont] = i;
                cont++;
            }
        }
        //Se recorre la lista de jugadores que est�n por detr�s del bal�n
        //para ver cu�l es el m�s cercano.
        double distMasCercana = 105.0;
        for (int i = 0; i < 11 && masAtrasBalon[i] != -1; i++) {
            double distAux = sp.balon().distancia(miEquipo[masAtrasBalon[i]]);
            if (distAux < distMasCercana) {
                distMasCercana = distAux;
                indMasCercanoTrasBalon = masAtrasBalon[i];
            }
        }
        if ((indMasCercanoTrasBalon != 0) || (indMasCercanoTrasBalon == 0 && sp.balon().getY() < -44.0)) {
            return indMasCercanoTrasBalon;
        } else {
            return -1;
        }

    }

    private int getIndMasCercanoDelanteBalon(SituacionPartido sp) {
        int indMasCercanoDelanteBalon = -1;
        Posicion miEquipo[] = sp.misJugadores();
        int[] delanteBalon = new int[11];
        for (int i = 0; i < 11; i++) {
            delanteBalon[i] = -1;
        }
        int cont = 0;
        for (int i = 0; i < 11; i++) {
            if (miEquipo[i].getY() > sp.balon().getY()) {
                delanteBalon[cont] = i;
                cont++;
            }
        }
        //Se recorre la lista de jugadores que est�n por delante del bal�n
        //para ver cu�l es el m�s cercano.
        double distMasCercana = 105.0;
        for (int i = 0; i < 11 && delanteBalon[i] != -1; i++) {
            double distAux = sp.balon().distancia(miEquipo[delanteBalon[i]]);
            if (distAux < distMasCercana) {
                distMasCercana = distAux;
                indMasCercanoDelanteBalon = delanteBalon[i];
            }
        }
        return indMasCercanoDelanteBalon;
    }

    private void rematarAPuerta(int indJugadorRemata, Posicion posJugadorRemata) {
        if (indJugadorRemata == 9) {
            comandos.add(new ComandoGolpearBalon(indJugadorRemata, new Posicion(1.0, 53.0), 2.0, 22.0));
        } else if (indJugadorRemata == 10) {
            comandos.add(new ComandoGolpearBalon(indJugadorRemata, new Posicion(-1.0, 53.0), 2.0, 22.0));
        } else {
            comandos.add(new ComandoGolpearBalon(indJugadorRemata, new Posicion(0.0, 53.0), 2.0, 22.0));
        }
    }

    private void pasarBalon(int indJugadorPasa, Posicion posJugadorRecibe) {
        comandos.add(new ComandoGolpearBalon(indJugadorPasa, posJugadorRecibe, 1.2, false));
    }

    private void avanzarConBalon(int indJugador) {
        comandos.add(new ComandoIrA(indJugador, Constantes.centroArcoSup));
        comandos.add(new ComandoGolpearBalon(indJugador));
    }

    private void despejar(int indJugador, Posicion posBalon) {
        if (posBalon.getX() <= 0.0) {
            comandos.add(new ComandoGolpearBalon(indJugador, new Posicion(-22.8, 0.0), Constantes.REMATE_VELOCIDAD_MAX, 50.0));
        } else {
            comandos.add(new ComandoGolpearBalon(indJugador, new Posicion(22.8, 0.0), Constantes.REMATE_VELOCIDAD_MAX, 50.0));
        }
    }

    private void disparoLejano(int indJugador) {
        comandos.add(new ComandoGolpearBalon(indJugador, Constantes.centroArcoSup, Constantes.REMATE_VELOCIDAD_MAX, true));
    }

    private void colocarPortero(Posicion posBalon) {
        if (posBalon.getY() >= -26.25) {
            comandos.add(new ComandoIrA(0, new Posicion(0.0, -52.0)));
        } else {
            //Cuadrantes A, B y C
            if (posBalon.getX() <= 0.0) {
                comandos.add(new ComandoIrA(0, new Posicion(Math.max(-3.6, posBalon.getX()), -52.0)));
            }else{
                comandos.add(new ComandoIrA(0, new Posicion(Math.min(3.6, posBalon.getX()), -52.0)));
            }
        }
    }

    private boolean getHayRivalDelante(Posicion posJugador, Posicion[] posRivales) {
        boolean hayRivalDelante = false;
        for (int i = 0; i < 11 && !hayRivalDelante; i++) {
            if (posJugador.distancia(posRivales[i]) <= 20.0 && posRivales[i].getY() > posJugador.getY()) {
                hayRivalDelante = true;
            }
        }
        return hayRivalDelante;
    }
}